note: redshift query

sqlserver2014から移行前提のメモ

  • with使える
  • convert(date, column) が使えなかった
  • 代わりに cast(column as date) or column::date
  • dateadd, datediff は使えた
  • explain 使える

変数利用

  • declare @varname type = value が使えない(t-sqlなので当たり前)
  • 使えない+下記構文より、定型クエリの微調整がめんどうだった

prepared_statement.sql

prepare prep_select_plan (int, varchar)
as
select
  *
  , $2 as myvar
from
  table_name
where id = $1;
execute prep_select_plan (2, 'aa');
execute prep_select_plan (3, 'bb');
deallocate prep_select_plan;

一時テーブル

  • #になれたせいか、とても面倒に感じた
  • global一時テーブル##table_name に似たものは未調査
create temporary table temp_table_name1 (id int, name varchar);

select *
into temporary table temp_table_name
from (
  select 1 as class, 2 as v1, 3 as v2
  union all select 1, 4, 5
  union all select 2, 6, 7
  union all select 2, 8, 9
) t

Window関数

  • sqlserverにもあるけど今回初めて知った
  • listagg within groupを初めて見た

listagg.sql

select
  class
  , listagg(v1, ',') within group (order by null) as a
from temp_table_name
group by
  class
;
select
  listagg(v1, ',') within group (order by class desc) as a
  , count(1)
from temp_table_name
;
select
  class
  , listagg(v1, ',') within group (order by null) over () as a
from temp_table_name
;
select
  class
  , listagg(v1, ',') within group (order by class) over (partition by class) as a
from temp_table_name

postgresqlとの比較

copy

postgresqlにもある

連番テーブル

generate_series.sql

-- カラムはgenerate_seriesになる
select
  *
from (select * from generate_series(1, 10)) as a
cross join (select * from generate_series(1, 10)) as b

配列

array_access.sql

select
  ids
  , case when ids[0] is null then 'null!' else 'not null' end
  , ids[1]
  , ids[2]
  , ids[3]
from (select array[1, 2, 3] as ids) t
  • sqlserverで使ったことない
  • array_agg が使えなかった(縦->横)
  • unnest が使えなかった(横->縦)

array_agg.sql

select
  class
  , array_agg(v1)
from temp_table_name
group by
  class

unnest.sql

select
  string
  , unnest(array[id1, id2, id3]) as id
from (
select
  'str' as string
  , '1' as id1
  , '2' as id2
  , '3' as id3
) as t

json

  • sqlserver2014にはなかった
  • 2016から使えるらしい (https://blogs.msdn.microsoft.com/jocapc/2015/05/16/json-support-in-sql-server-2016/)

json.sql

select
  -- ↓使えなかった
  -- json_to_record('{"key1": "value1", "key2": 2}')
    json_extract_path_text('{"key1": {"nest_key": "nest_value"}, "key2": 2}', 'key1', 'nest_key')
  , json_extract_path_text('{"key1": {"nest_key": "nest_value"}, "key2": 2}', 'key1')
  , json_extract_path_text('{"key1": {"nest_key": "nest_value"}, "key2": 2}', 'key100')
  , json_extract_array_element_text('[1, 2, [3, 4], 5]', 2)
  , json_extract_array_element_text('[1, 2, [3, 4], 5]', 100)
  , json_array_length('[1, 2, [3, 4], 5]')
  --, json_array_length('{"1": 2, "[3, 4]": 5]') -- error

udf

一覧はこれを見る

select *
from pg_proc
order by proname
  • http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_join_pg.html
  • http://stackoverflow.com/questions/33083500/how-to-get-a-list-of-udfs-in-redshift